
//模糊检索指令

//页面定义一个div 形如
// <div ed-auto-search data-options="showSelectEvent : 'showSelect', changeEvent : 'changeSearchVal',
//      showSelectUrl : 'web/resCheckFuzzyQuery.do'" data-params="queryType : 'search.queryType'">
// </div>
//其中需要定义展示数据的url web/resCheckFuzzyQuery.do

//选择查询出的值的事件 该事件需自己在自己的controller中实现
//格式为 ；
//$scope.changeSearchVal = function(selectVal) {
//    Page.ajaxPostQuiet('web/resCheckQuery.do', {param : selectVal,queryType : $scope.search.queryType,
//        _pageSize : $scope._pageSize, _pageIndex : $scope._pageIndex}, function (resp) {
//        $scope.resList = resp.data.rows;
//    });
//}
// selectVal为展示数据url中返回的json格式

//author : zlh

starter.directive('edAutoSearch', ['Page',function (Page) {

    return {

        restrict: 'A',

        replace: true,

        template:function (elem, attrs) {
            var option = AppUtil.jsonfy(attrs.options);
            return '<div style="width: 100%;padding-right: 10px;">'
                + '<input type="text" style="height:30px;background-color: #eee;border-color: #ddd;" autocomplete="off" id="showText" '
                + 'ng-model="search.originalVal" placeholder="'+(option.placeholder ? option.placeholder : 'search')+'" '
                + 'changeValue="' + option.changeEvent + '()" />'

        },

        link: function (scope, elem, attrs, controller, transcludeFn) {
            //配置
            var option = AppUtil.jsonfy(attrs.options);
            //参数
            var paramsOption = AppUtil.jsonfy(attrs.params);

            if(!scope[attrs.edAutoSearch]){
                scope[attrs.edAutoSearch] = {};
            }

            var autoSearch = scope[attrs.edAutoSearch];
            //if(option.changeType != undefined && option.changeType != "") {
            //    var placeholder = scope[option.changeType]();
            //    $("#showText").attr("placeholder",placeholder);
            //}
            autoSearch.setPlaceholder = function(title) {
                $("#showText").attr("placeholder",title);
            }

            $("#showText").on("input",function(){
                //处理参数
                var ajaxParams = {};
                ajaxParams.param = $("#showText").val();
                ajaxParams._pageSize = 10;
                ajaxParams._pageIndex = 0;
                for (var key in paramsOption) {
                    if(paramsOption[key].indexOf(".") != -1) {
                        var splitArr = paramsOption[key].split(".");
                        var paramVal = "";
                        for (var i = 0; i < splitArr.length; i++) {
                            if(i == 0) {
                                paramVal = paramVal + "scope['" + splitArr[i] + "']";
                            } else {
                                paramVal = paramVal + "['" + splitArr[i] + "']";
                            }
                        }
                        ajaxParams[key] = eval(paramVal);
                    } else {
                        ajaxParams[key] = scopescope[paramsOption[key]];
                    }
                }
                Page.ajaxPostQuiet(option.showSelectUrl, ajaxParams, function (resp) {
                    var searchDatas = resp.data.rows;
                    var showNameArr = [];
                    for (var i = 0; i < searchDatas.length; i++) {
                        showNameArr.push(searchDatas[i].showName);
                    }
                    var autoComplete = new AutoComplete('showText', 'autoText', showNameArr);
                    autoComplete.start(event);
                });
            })

            var getDomObj = function (id) {
                return "string" == typeof id ? document.getElementById(id) : id;
            }
            var Bind = function (object, fun) {
                return function () {
                    return fun.apply(object, arguments);
                }
            }
            function AutoComplete(obj, autoObj, arr) {
                this.obj = getDomObj(obj);        //输入框
                this.autoObj = getDomObj(autoObj);//DIV的根节点
                this.value_arr = arr;        //不要包含重复值
                this.index = -1;          //当前选中的DIV的索引
                this.search_value = "";   //保存当前搜索的字符
            }
            AutoComplete.prototype = {
                //初始化DIV的位置
                init: function () {
                    this.autoObj.style.left = this.obj.offsetLeft + "px";
                    this.autoObj.style.top = this.obj.offsetTop + this.obj.offsetHeight + "px";
                    this.autoObj.style.width = this.obj.offsetWidth - 2 + "px";//减去边框的长度2px
                },
                //删除自动完成需要的所有DIV
                deleteDIV: function () {
                    while (this.autoObj.hasChildNodes()) {
                        this.autoObj.removeChild(this.autoObj.firstChild);
                    }
                    this.autoObj.className = "auto_hidden";
                },
                //设置值
                setValue: function (_this) {
                    return function () {
                        _this.obj.value = this.seq;
                        _this.autoObj.className = "auto_hidden";
                        //$scope.changeSearchVal(this.seq);
                        scope[option.changeEvent](this.seq);
                    }
                },
                //模拟鼠标移动至DIV时，DIV高亮
                autoOnmouseover: function (_this, _div_index) {
                    return function () {
                        _this.index = _div_index;
                        var length = _this.autoObj.children.length;
                        for (var j = 0; j < length; j++) {
                            if (j != _this.index) {
                                _this.autoObj.childNodes[j].className = 'auto_onmouseout';
                            } else {
                                _this.autoObj.childNodes[j].className = 'auto_onmouseover';
                            }
                        }
                    }
                },
                //更改classname
                changeClassname: function (length) {
                    for (var i = 0; i < length; i++) {
                        if (i != this.index) {
                            this.autoObj.childNodes[i].className = 'auto_onmouseout';
                        } else {
                            this.autoObj.childNodes[i].className = 'auto_onmouseover';
                            this.obj.value = this.autoObj.childNodes[i].seq;
                        }
                    }
                }
                ,
                //响应键盘
                pressKey: function (event) {
                    var length = this.autoObj.children.length;
                    //光标键"↓"
                    if (event.keyCode == 40) {
                        ++this.index;
                        if (this.index > length) {
                            this.index = 0;
                        } else if (this.index == length) {
                            this.obj.value = this.search_value;
                        }
                        this.changeClassname(length);
                    }
                    //光标键"↑"
                    else if (event.keyCode == 38) {
                        this.index--;
                        if (this.index < -1) {
                            this.index = length - 1;
                        } else if (this.index == -1) {
                            this.obj.value = this.search_value;
                        }
                        this.changeClassname(length);
                    }
                    //回车键
                    else if (event.keyCode == 13) {
                        this.autoObj.className = "auto_hidden";
                        this.index = -1;
                    } else {
                        this.index = -1;
                    }
                },
                //程序入口
                start: function (event) {
                    if (event.keyCode != 13 && event.keyCode != 38 && event.keyCode != 40) {
                        this.init();
                        this.deleteDIV();
                        this.search_value = this.obj.value;
                        var valueArr = this.value_arr;
                        valueArr.sort();
                        if (this.obj.value.replace(/(^\s*)|(\s*$)/g, '') == "") {
                            return;
                        }//值为空，退出
                        try {
                            var reg = new RegExp("(" + this.obj.value + ")", "i");
                        }
                        catch (e) {
                            return;
                        }
                        var div_index = 0;//记录创建的DIV的索引
                        for (var i = 0; i < valueArr.length; i++) {
                            if (reg.test(valueArr[i])) {
                                var div = document.createElement("div");
                                div.className = "item auto_onmouseout";
                                div.style.width = screen.width + "px";
                                div.style.borderRight = "none";
                                div.style.height = "40px";
                                div.style.paddingTop = "9px";
                                div.seq = valueArr[i];
                                div.onclick = this.setValue(this);
                                div.onmouseover = this.autoOnmouseover(this, div_index);
                                div.innerHTML = valueArr[i].replace(reg, "<strong style='color : #B45'>$1</strong>");//搜索到的字符粗体显示
                                this.autoObj.appendChild(div);
                                this.autoObj.className = "auto_show";
                                div_index++;

                            }
                        }
                    }
                    this.pressKey(event);
                    window.onresize = Bind(this, function () {
                        this.init();
                    });
                }
            }
        }

    };
}]);